perm filename FTPR.C[11,HE] blob sn#688212 filedate 1982-12-06 generic text, type T, neo UTF8
/*
 * eftprec.c
 *
 * Simple eftp receiver program; not as flexable as "eftp", but
 * does Pup internet routing right.
 *
 * Modified by hedberg  Mon Jul 26 16:23:44 1982
 *	Hacked up from eftpsend
 * Again by Jeffrey Mogul	28 July 1982
 *	Cleaned it up somewhat (removed irrelevant code)
 *
 * Jeffrey Mogul		6 November 1981		Stanford University
 *
 * Synopsis:
 *	eftprec hostname filename [key]
 *
 *	key is initial letter(s) of: debug, unswap
 *		(n.b.: "unswap" is wrt local byte order; the default
 *		 on Vax-to-dover transfers is "swap")
 *
 *	This program is roughly equivalent to
 *	"eftp xeqs" <hostname> <filename>
 */
#include <stdio.h>
#include <eftp.h>
#include <pupstatus.h>
#include <pupconstants.h>

#define	BUFFERSIZE 512
#define	CHAN_TIMEOUT	5*60	/* seconds */

#define	DEBUG	if (debug) printf

char buf[BUFFERSIZE];

/* flags */
int debug = 0;
int unswap = 0;

main(argc,argv)
int argc;
char **argv;
{	/* */
	struct EftpChan ec;
	struct Port remport;
	int i;
	int stat;
	int done = 0;
	int tsize;
	int rsize;
	FILE *locfile;
	long tstart;

	if ((argc > 4) || (argc < 3)) {
	    fprintf(stderr,"Usage: eftprec hostname filename [du]\n");
	    exit(1);
	}

	if (argc == 4) {	/* key to be parsed */
	    char *kp = argv[3];
	    
	    while (*kp) {
	    	switch (*kp) {
		
		case 'd': debug++;
			  break;

		case 'u': unswap++;
			  break;
		
		default: fprintf(stderr,"Unknown key: %c\n",*kp);
			 exit(1);
		}
		kp++;
	    }
	}


	if ((locfile = fopen(argv[2],"w")) == NULL) {
	    perror("eftprec");
	    fprintf(stderr,"[open failed on %s]\n",argv[2]);
	    exit(1);
	}

ReLookup:
	switch (mlookup(argv[1],&remport)) {
	
		case OK:
			DEBUG("Host:%s is ",argv[1]);
			if (debug) {
			    PortPrint(&remport);
			    printf("\n");
			}
			break;
		
		case NOTFOUND:
			fprintf(stderr,"[Host %s name not found]\n",argv[1]);
			exit(1);

		case NOCHAN:
			DEBUG("Waiting for free network channel\n");
			sleep(30);
			goto ReLookup;
				
		case TIMEOUT:
			fprintf(stderr,"[Name server did not respond]\n");
			exit(1);

		default:
			fprintf(stderr,
				"[eftprec: internal error in lookup]\n");
			exit(1);
	}


Restart:

#ifdef	PUP__NNSO
	switch(EfRecOpen(&ec, &remport, CHAN_TIMEOUT, unswap)) {
#else
	switch(EfRecOpen(&ec, &remport, CHAN_TIMEOUT, !unswap)) {
#endif	
		case OK:
			DEBUG("Open OK\n");
			break;

		case NOCHAN:
			DEBUG("Waiting for free network channel\n");
			sleep(30);
			goto Restart;
		
		case NOROUTE:
			fprintf(stderr,"[Cannot get to %s from here]\n",
					argv[1]);
			exit(1);
	}
	
	tstart = time(0);
	tsize = 0;

	while (!done) {
		switch(stat = EftpRead(&ec,buf,BUFFERSIZE,&rsize)) {

		case OK:
			tsize += rsize;	/* add in OLD rsize */
			if (fwrite(buf,sizeof(*buf),rsize,locfile) == 0){
				fprintf(stderr,"file write failed: ");
				perror("eftprec");
				exit(1);
			}
			DEBUG("read %d bytes OK\n",rsize);
			break;

		case TIMEOUT:
			fprintf(stderr,"[Receive timed out]\n");
			exit(1);

		case EFTP_ENDOFFILE:
			DEBUG("Received EOF\n");
			done++;
			break;
		
		case EFTP_ABORT:
			fprintf(stderr,"[Abort code %o: %s]\n",
				EftpAbortCode,EftpErrMsg);
			exit(1);

		case EFTP_WAIT:
			switch (EftpAbortCode) {
			
			case EFTPA_LONGWAIT:
				DEBUG("waiting %d seconds\n",EFTPW_LWAIT);
				sleep(EFTPW_LWAIT);
				break;

			case EFTPA_MEDWAIT:
				DEBUG("waiting %d seconds\n",EFTPW_MWAIT);
				sleep(EFTPW_MWAIT);
				break;

			case EFTPA_RECBUSY:
				DEBUG("waiting %d seconds\n",EFTPW_RBUSY);
				sleep(EFTPW_RBUSY);
				break;

			default:
				fprintf(stderr,"[eftprec: internal error, ");
				fprintf(stderr,"inconsistent abort code:\n");
				fprintf(stderr,"status = %o\n",stat);
				fprintf(stderr,"abort code = %o :%s :%s]\n",
					EftpAbortCode,EftpErrMsg,PupErrMsg);
				exit(1);
			}
			goto Restart;
		
		case EFTP_ERROR:
			fprintf(stderr,"[eftprec: EFTP protocol error]\n");
			exit(1);
		
		case EFTP_RESTART:
			DEBUG("eftp restart\n");
			goto Restart;

		case EFTP_OUTOFSYNCH:
			fprintf(stderr,"[eftprec: Sender out of synch]\n");
			exit(1);

		default:
			fprintf(stderr,"[eftprec: internal error,");
			fprintf(stderr,"status = %o\n",stat);
			fprintf(stderr,"abort code = %o :%s :%s]\n",
				EftpAbortCode,EftpErrMsg,PupErrMsg);
			exit(1);
		}
	}

	EfRecEnd(&ec);

	tstart -= time(0);
	DEBUG("time = %d, rate = %d\n",-tstart,-(tsize*8)/tstart);

	exit(0);
}